#coding:utf8
# 您的自定义存储系统必须是以下子类 django.core.files.storage.Storag

from django.core.files.storage import Storage

from fdfs_client.client import Fdfs_client

#2Django必须能够在没有任何参数的情况下实例化您的存储系统。
# 这意味着任何设置都应该来自django.conf.settings
from django.conf import settings

# 4.您的存储类必须是可解构的， 以便在迁移中的字段上使用时可以对其进行序列化。只要您的字段具有可自行序列化的参数，
# 就 可以使用 django.utils.deconstruct.deconstructible类装饰器（这就是Django在FileSystemStorage上使用的）。

from django.utils.deconstruct import deconstructible

@deconstructible
class MyStorage(Storage):

    def __init__(self,client_path=None,ip=None):



        if client_path is None:
            self.client_path = settings.FDFS_CLIENT_CONF

        if ip is None:
            self.ip = settings.FDFS_URL

    # 3,您的存储类必须实现_open()和_save() 方法以及
    # 适用于您的存储类的任何其他方法

    # 打开我们的资源, 我们采用fastdfs 实现文件的上传和下载,所以不需要实现里边的逻辑
    def _open(self,name,model='rb'):
        pass


    # 保存 默认会保存到文件中,我们需要实现里边的业务逻辑来保存到fdfs
    def _save(self,name,content,max_length=None):

        # I 获取图片内容
        # content 内容 二进制
        file_data = content.read()

        # II  创建 fdfs_client 客户端,加载 FDFS的配置信息
        client = Fdfs_client(self.client_path)
        # client = Fdfs_client(settings.FDFS_CLIENT_CONF)
        # client = Fdfs_client('/home/python/')
        # buffer 二进制的读取
        result = client.upload_by_buffer(file_data)

        # III 根据上传结果 返回 图片路径
        # {'Group name': 'group1',
        #  'Remote file_id': 'group1/M00/00/02/wKjlhVtFriWAACEbAAT-6_mSZR0307.jpg',
        #  'Storage IP': '192.168.229.133',
        #  'Status': 'Upload successed.',
        #  'Local file name': '/home/python/Desktop/images/2.jpg',
        #  'Uploaded size': '319.00KB'}
        if result.get('Status') == 'Upload successed.':
            # 返回 保存的路径
            return result.get('Remote file_id')
        else:
            raise Exception('上传失败')

    # fastdfs 可以实现文件重名工作 能够确保上传的图片不会被覆盖
    def exists(self, name):

        return False

    def url(self, name):


        # name 是 我们在保存的时候的  group1/M00/00/02/wKjlhVtFriWAACEbAAT-6_mSZR0307.jpg
        return settings.FDFS_URL + name
        # return  self.ip + name